#include <stdio.h>
#include <cstdlib>

/*此处是顺序栈数据结构定义*/
typedef int DataType;
struct seqStack
{//有3个数据成员
    int MAXNUM;//用于记录顺序栈中能存放的最大元素个数的 整型 MAXNUM
    int top;//用于存放顺序栈的栈顶位置，初始化为0或-1 均可  整型  curNum
    DataType *element;//用于存放顺序栈数据元素的连续空间的起始地址
};

typedef struct seqStack *PseqStack;
//第一关
PseqStack createNullStack_seq(int m)
{//此处填写代码，创建一个空的顺序栈，能存放的最大元素个数为 m,栈顶top设置为0
    //若m=0，则返回NULL
    PseqStack l;
    if(m==0) return NULL;
    l=(PseqStack)malloc(sizeof(PseqStack));
    l->MAXNUM=m;
    l->top=0;
    l->element=(int*)malloc(sizeof(PseqStack)*m);//int*这里不确定对不对，主要是clion报错233
}

//第二关
int isNullStack_seq(PseqStack L)
{
    //判断顺序栈是否为空，若为空，返回值为1，否则返回值为0,若栈不存在，则返回-1
    if (L==NULL)//判断栈是否存在
        return -1;
    if(L->top==0)//是否为空
        return 1;
    return 0;//否则返回
}


//第三关
int isFullStack_seq(PseqStack L)
{
    //判断顺序栈是否已满，若已满，返回值为1，否则返回值为0
    return L->top==L->MAXNUM;
}


//第四关
int push_seq(PseqStack L ,DataType x)
{//在顺序栈中插入数据元素x，若插入不成功，返回0；插入成功返回值为1
    if(L->top==L->MAXNUM)//如果top初始值赋-1，这里L->max要减1
        return 0;
    L->top=L->top+1;
    L->element[L->top]=x;
    return 1;
}



//第五关
DataType pop_seq(PseqStack L)
{//弹栈并返回删除元素，若栈为空，则返回-1
    if(L->top==0)
        return -1;
    int p;
    p=L->element[L->top];//读取栈顶元素
    L->top=L->top-1;
    return p;
}

//第六关
DataType top_seq(PseqStack L)
{// 取栈顶元素返回，若栈为空，则返回-1
    if(L->top==0)
        return -1;
    return L->element[L->top];
}

//销毁顺序栈，释放栈所占存储空间
int destroystack_seq(PseqStack L)
{
    //返回值为销毁的栈中现有数据元素的个数，若待销毁的线性表不存在，则返回0
    if(L==NULL)
        return 0;
    return L->top;
}


//第七关
//使用已实现的栈操作，实现数制转换

void print(PseqStack L)
{
//逐个弹出栈L中的数据元素并输出，输出数据间不需要任何间隔符号
    int q;//判断十六进制
    while(L->top!=0)
    {
        q=L->element[L->top];
        if(q==10)
            printf("A");
        else if(q==11)
            printf("B");
        else if(q==12)
            printf("C");
        else if(q==13)
            printf("D");
        else if(q==14)
            printf("E");
        else if(q==15)
            printf("F");
        else
            printf("%d",q);
        L->top=L->top-1;
    }

}

void convert(int data , int k)
{
//利用栈实现将data转换为k进制，k可能是2，8，16. 在本函数内实现转换并调用print函数输出转换后的结果
//十六进制时输出 A ,B ,C, D,E,F 使用大写字母
    PseqStack L=createNullStack_seq(8);//创建顺序栈用来存储余数
    int n=data;//用来存储得数，第一位是需要转换的数
    int a;//用来存储几进制转换十进制
    switch (k)
    {
        case 2: a=2;break;
        case 8:a=8;break;
        case 16:a=16;break;
    }
    while(n%a!=0 ||n>0)
    {
        push_seq(L ,n%a);//将所得余数输进数组
        n=n/a;
    }
    print(L);
}

